package model

import (
	"context"
	"gorm.io/gorm"
)

type (
	RoleApi interface {
		Insert(ctx context.Context, roleId, apiId int) error
		BatchInsert(ctx context.Context, roleId int, records []*AuthxRoleApi) error
		BatchInsertDelGroupId(ctx context.Context, groupId int, records []*AuthxRoleApi) error
		FindByRoleId(ctx context.Context, roleId int) ([]*AuthxRoleApi, error)
		FindByRoleIdAndApiId(ctx context.Context, roleId, apiId int) (*AuthxRoleApi, error)
		Delete(ctx context.Context, roleId, apiId int) error
		DeleteByRoleId(ctx context.Context, roleId int) error
	}

	defaultRoleApi struct {
		db *gorm.DB
	}
)

func NewRoleApi(db *gorm.DB) RoleApi {
	return &defaultRoleApi{
		db: db,
	}
}

func (d *defaultRoleApi) model() *gorm.DB {
	return d.db.Model(&AuthxRoleApi{})
}

func (d *defaultRoleApi) Insert(ctx context.Context, roleId, apiId int) error {
	return d.db.Create(&AuthxRoleApi{
		RoleId: roleId,
		ApiId:  apiId,
	}).Error
}

func (d *defaultRoleApi) BatchInsert(ctx context.Context, roleId int, records []*AuthxRoleApi) error {
	d.model().Where("role_id = ?", roleId).Delete(&AuthxRoleApi{})

	return d.db.Create(&records).Error
}

func (d *defaultRoleApi) BatchInsertDelGroupId(ctx context.Context, groupId int, records []*AuthxRoleApi) error {
	d.model().Where("group_id = ?", groupId).Delete(&AuthxRoleApi{})

	return d.db.Create(&records).Error
}

func (d *defaultRoleApi) FindByRoleId(ctx context.Context, roleId int) ([]*AuthxRoleApi, error) {
	var result []*AuthxRoleApi
	if err := d.model().Where("role_id = ?", roleId).Find(&result).Error; err != nil {
		return nil, err
	}
	return result, nil
}

func (d *defaultRoleApi) FindByRoleIdAndApiId(ctx context.Context, roleId, apiId int) (*AuthxRoleApi, error) {
	var result *AuthxRoleApi
	if err := d.model().Where("role_id = ? and api_id = ?", roleId, apiId).First(&result).Error; err != nil {
		return nil, err
	}
	return result, nil
}

func (d *defaultRoleApi) Delete(ctx context.Context, roleId, apiId int) error {
	return d.model().
		Where("role_id = ? AND api_id = ?", roleId, apiId).
		Delete(&AuthxRoleApi{}).Error
}

func (d *defaultRoleApi) DeleteByRoleId(ctx context.Context, roleId int) error {
	return d.model().
		Where("role_id = ?", roleId).
		Delete(&AuthxRoleApi{}).Error
}
